package DBLayer;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;


import ModelLayer.*;


/**
 * 
 * @author DMAA0213 - Gruppe 2
 *
 */
public class DBHold implements IFDBHold {
	
	private Connection con;

	/**
	 * Constructor for DBHold objekt, uden parametre.
	 * Her startes DBConnection, hvis denne ikke i forevejen er aktiv. 
	 * 
	 * @throws SQLException Kaster SQLException hvis der er fejl i connection 
	 */
	public DBHold() throws SQLException {
		try {
			con = DBConnection.getInstance().getDBcon();
		}
		catch (SQLException e) {
			throw e;
		}
	}

	
	private Hold buildHold(ResultSet result) throws SQLException {
		IFDBLokalitet l = new DBLokalitet();
		IFDBMedlem m = new DBMedlem();
		IFDBSpilsystem s = new DBSpilsystem();
		Hold hold = new Hold();
		try {
			
			hold.setId(result.getInt("id"));
			hold.setNavn(result.getNString("navn"));
			hold.setBeskrivelse(result.getString("beskrivelse"));
			hold.setLokalitet(l.hent(result.getInt("lokalitetId")));
			hold.setSpilsystem(s.hent(result.getInt("spilsystemId")));
			hold.setStarttidspunkt(result.getNString("starttidspunkt"));
			hold.setTidsblok(Tidsblok.valueOf(result.getNString("tidsblok")));
			hold.setInterval(Interval.valueOf(result.getNString("interval")));
			hold.setGamemaster(m.hent(result.getInt("gamemasterId")));
			hold.setStatus(HoldStatus.valueOf(result.getNString("holdstatus")));
		
		}
						
		 catch (SQLException e) {
			 System.out.println("fejl i forbindelse med oprettelse af hold");
			
			throw e;
		}
		return hold;
	}
	
	
	@Override
	public ArrayList<Hold> hentListeAktive() throws SQLException {
		
		ArrayList<Hold> arrayListHold = new ArrayList<Hold>();
		
		Hold h = null;
		try {
		String query = "SELECT id, navn, beskrivelse, lokalitetId, spilsystemId, "
				+ "starttidspunkt, tidsblok, interval, gamemasterId, holdstatus "
				+ "FROM Hold "
				+ "WHERE holdstatus='AKTIV' OR holdstatus='STANDBY'";
		ResultSet result = null;
			
			PreparedStatement ps = con.prepareStatement(query);
			result = ps.executeQuery();
			while(result.next()) {
				h = buildHold(result);
				
				String query1 = "SELECT medlemId FROM HoldMedlemmer WHERE holdId=?";
				PreparedStatement ps1 = con.prepareStatement(query1);
				ps1.setInt(1, h.getId());
				ResultSet rs1 = ps1.executeQuery();
				DBMedlem dbm= new DBMedlem();
				while(rs1.next()) {
					h.tilfoejSpiller(dbm.hent(rs1.getInt("medlemId")));
				}
				
				
				arrayListHold.add(h);
			}
		} catch (SQLException e) {
			throw e;
		}
		

		return arrayListHold;
	}
	

	@Override
	public void gem(Hold hold) throws SQLException {
		
		try{				
			DBConnection.startTransaction();

			String query = "INSERT into Hold(id, navn, beskrivelse, lokalitetId, spilsystemId, starttidspunkt, tidsblok, interval, gamemasterId, holdstatus) "
					+ "Values (?,?,?,?,?,?,?,?,?,?)";
					
			
			
			
			int nextId = GetMax.getMaxId("SELECT max(id)+1 FROM Hold");
			hold.setId(nextId);

			PreparedStatement ps = con.prepareStatement(query);
			ps.setInt(1, nextId);
			ps.setString(2, hold.getNavn());
			ps.setString(3, hold.getBeskrivelse());
			ps.setInt(4, hold.getLokalitet().getId());
			ps.setInt(5, hold.getSpilsystem().getId());
			ps.setString(6, hold.getStarttidspunkt());
			ps.setNString(7, hold.getTidsblok().name());
			ps.setNString(8, hold.getInterval().name());
			ps.setInt(9, hold.getGamemaster().getId());
			ps.setString(10, hold.getStatus().toString());
			ps.executeUpdate();
			
			for(Medlem m: hold.getSpillere()) {
			
			String query2 = "INSERT into HoldMedlemmer(holdId, medlemId)"
						+ "Values (?,?)"; 
			
			PreparedStatement ps2 = con.prepareStatement(query2);
			ps2.setInt(1, nextId);
			ps2.setInt(2, m.getId());
			ps2.executeUpdate();
			
			}
			DBConnection.commitTransaction();

		} catch (SQLException e) {
			DBConnection.rollbackTransaction();
			throw e;
		}
		
		
	}
	
	
}
